# -*- coding: utf-8 -*-
import hashlib
import logging
import os
import random
import socket
import sys
import time
from pathlib import Path

path = os.path.abspath(__file__)
sys.path.append(str(Path(__file__).absolute().parent.parent.parent))
from publics.Snowflake import SnowflakeIDGenerator


def generateSnowId(func, retries=0, delay=0.2, last_snowflake_id=0):
    """
    重试逻辑函数
    :param func: 需要重试的函数
    :param retries: 最大重试次数，默认为 3
    :param delay: 每次重试的延迟时间（秒），默认为 0.2 秒
    :param last_snowflake_id: 上一次生成的雪花ID
    :return: 函数执行结果，如果重试失败则返回 None
    """
    if retries > 10: return logging.error(f"所有 {retries} 次尝试均失败")
    try:
        result = func.next_id()  # 调用函数
        if result == last_snowflake_id:
            raise ValueError("生成的雪花ID与上一次相同")
        else:
            last_snowflake_id = result
        return last_snowflake_id  # 如果成功，返回结果
    except Exception as e:
        logging.error(f"获取时间戳，第 {retries} 次尝试失败: {e}")
        time.sleep(delay)
        return generateSnowId(func, retries + 1, delay)


generator = SnowflakeIDGenerator(datacenter_id=1, worker_id=1)


def snowflake():
    snow = generateSnowId(generator)
    return snow


# 获取当前服务器的IP地址
def local():
    """
    查询本机ip地址
    :return:
    """
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
    finally:
        s.close()
    return ip


def elapsed_time(func):
    """
    装饰器：计算函数运行时间
    """

    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录函数开始时间
        result = func(*args, **kwargs)  # 执行被装饰的函数
        end_time = time.time()  # 记录函数结束时间

        runtime = end_time - start_time  # 计算函数运行时间
        logging.info(f"函数 {func.__name__} 运行耗时：{runtime:.6f} 秒")
        return result

    return wrapper


def md5_encrypt(input_string):
    """
    对输入的字符串进行MD5加密。
    Args:
        input_string (str): 需要进行MD5加密的字符串。
    Returns:
        str: 加密后的字符串，以16进制形式表示。
    """
    # 创建一个md5哈希对象
    md5_hash = hashlib.md5()
    # 将输入字符串转换为utf-8编码的字节串，并更新到md5哈希对象中
    md5_hash.update(input_string.encode('utf-8'))
    # 获取md5哈希对象的16进制表示的字符串
    encrypted_string = md5_hash.hexdigest()
    # 返回加密后的字符串
    return encrypted_string


def generate_unique_id(input_string):
    """
    根据输入的字符串生成一个唯一的32位数字字符串ID。
    Args:
        input_string (str): 需要生成唯一ID的输入字符串。
    Returns:
        str: 生成的32位唯一数字字符串ID。
    """
    # 使用SHA-256哈希函数生成哈希值
    hash_object = hashlib.sha256(input_string.encode())
    # 将哈希值转换为16进制字符串
    hex_dig = hash_object.hexdigest()
    # 将16进制字符串转换为10进制数字
    decimal_number = int(hex_dig, 16)
    # 将10进制数字转换为32位数字字符串
    unique_id = str(decimal_number)[:32]
    return unique_id


def UserAgent():
    os_versions = [
        '10.0; Win64; x64', '10.0; WOW64', '10.0', '6.3; Win64; x64', '6.3; WOW64', '6.2; WOW64', '6.2; Win64; x64',
        '6.2', '6.1', '6.1; Win64; x64', '6.1; WOW64'
    ]
    chrome_versions = [
        '91.0.4472.124', '92.0.4515.131', '93.0.4577.63', '94.0.4606.61', '95.0.4638.69',
        '96.0.4664.45', '97.0.4692.71', '98.0.4758.102', '99.0.4844.51', '100.0.4896.60',
        '101.0.4951.41', '102.0.5005.115', '103.0.5060.53', '104.0.5112.101', '105.0.5195.125',
        '106.0.5249.61', '107.0.5304.88', '108.0.5359.73', '109.0.5414.25', '110.0.5481.30',
        '111.0.5563.110', '112.0.5615.49', '113.0.5672.126', '114.0.5735.198', '115.0.5790.98',
        '116.0.5845.179', '117.0.5907.74', '118.0.5980.114', '119.0.6047.52', '120.0.6110.73']
    return "Mozilla/5.0 (Windows NT {}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{} Safari/537.36".format(
        random.choice(os_versions), random.choice(chrome_versions)
    )


if __name__ == '__main__':
    # 示例使用
    input_string = "example_string"
    unique_id = generate_unique_id(input_string)
    print(f"输入字符串: {input_string}\n生成的32位数字ID: {unique_id}")
